package com.cuz.daileetcode;

import java.util.Stack;

/**
 * @author cuzz
 * @version 1.0
 * @description: 20. 有效的括号
 * 给定一个只包括 '('，')'，'{'，'}'，'['，']' 的字符串 s ，判断字符串是否有效。
 * <p>
 * 有效字符串需满足：
 * <p>
 * 左括号必须用相同类型的右括号闭合。
 * 左括号必须以正确的顺序闭合。
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * 输入：s = "()"
 * 输出：true
 * 示例 2：
 * <p>
 * 输入：s = "()[]{}"
 * 输出：true
 * 示例 3：
 * <p>
 * 输入：s = "(]"
 * 输出：false
 * 示例 4：
 * <p>
 * 输入：s = "([)]"
 * 输出：false
 * 示例 5：
 * <p>
 * 输入：s = "{[]}"
 * 输出：true
 * <p>
 * <p>
 * 提示：
 * <p>
 * 1 <= s.length <= 104
 * s 仅由括号 '()[]{}' 组成
 * @date 20:13 2021/10/3
 **/
public class Day15_2 {

    static class S1 {
        public static void main(String[] args) {
            System.out.println(isValid("(]"));
        }

        public static boolean isValid(String s) {
            if (s == null || "".equals(s) || s.length() % 2 != 0) {
                return false;
            }
            Stack<Character> memory = new Stack<>();
            char[] charArray = s.toCharArray();
            for (int index = 0; index < charArray.length; index++) {
                if (charArray[index] == '(' || charArray[index] == '[' || charArray[index] == '{') {
                    memory.push(charArray[index]);
                } else {
                    if (memory.isEmpty()) {
                        return false;
                    } else {
                        Character pop = memory.pop();
                        if ((charArray[index] == ')' && pop != '(')) {
                            return false;
                        }
                        if ((charArray[index] == ']' && pop != '[')) {
                            return false;
                        }
                        if (charArray[index] == '}' && pop != '{') {
                            return false;
                        }
                    }
                }
            }
            return memory.isEmpty();
        }
    }
}
